
# -*- coding: utf-8 -*-

import debug
import logging
import datetime
from SeBase import SeBase

class SeMemory(SeBase):
    @debug.entry
    def __init__(self, config=None):
        '''
            <TODO>
                コンフィグ読み込みや永続化が必要なストレージ接続を行う
        '''
        self.config = config
        self.__read_config(self.config)

        self.storage = []

    def __read_config(self, config):
        '''
            <TODO>
                ストレージ接続に必要な情報を読み込む
        '''
        self.cycle = int( config['object'].get(self.__class__.__name__, 'cycle') )

    @debug.entry
    def get_frame_list_all(self, target, fext='.jpg'):
        '''
            <TODO>
                ストレージに保存されたフレームリストを返す
            target : カメラID
            return : パス、拡張子を含まないリスト(全件)
                ex)
                    target@YYYY-mm-ddTHH:MM:SS.ffffffZ
                    本来はもっと効率よく引きたい
        '''
        items = []
        for item in self.storage:
            logging.debug( item['CID'] + '@' + item['Date'] + item['Fext'] )
            if target == item['CID'] and fext == item['Fext']:
                items.append(item['CID'] + '@' + item['Date'])

        return items

    @debug.entry
    def get_frame_list_first(self, target, fext='.jpg'):
        '''
            <TODO>
                ストレージに保存されたフレームで一番古いものを返す
            target : カメラID
            return : パス、拡張子を含まないリスト(1件)
                ex)
                    target@YYYY-mm-ddTHH:MM:SS.ffffffZ
        '''
        items = self.get_frame_list_all(target, fext)
        return [ items[0] ]

    @debug.entry
    def get_frame_list_last(self, target, fext='.jpg'):
        '''
            <TODO>
                ストレージに保存されたフレームで一番新しいものを返す
            target : カメラID
            return : パス、拡張子を含まないリスト(1件)
                ex)
                    target@YYYY-mm-ddTHH:MM:SS.ffffffZ
        '''
        items = self.get_frame_list_all(target, fext)
        return [ items[len(items)-1] ]

    @debug.entry
    def get_frame_list_range(self, target, query, fext):
        '''
            <TODO>
                ストレージに保存されたフレームの時間範囲で返す
            target : カメラID
            query  : list(termfrom, termto)
            return : パス、拡張子を含まないリスト(N件)
                ex)
                    target@YYYY-mm-ddTHH:MM:SS.ffffffZ
        '''
        termfrom = datetime.datetime.strptime(query[0], '%Y-%m-%dT%H:%M:%S.%fZ')
        termto   = datetime.datetime.strptime(query[1], '%Y-%m-%dT%H:%M:%S.%fZ')
        logging.debug("Frame Search Range : %s - %s" % (termfrom, termto))

        resp = []
        items = self.get_frame_list_all(target, fext)
        for item in items:
            timestring = item.split('@')[1]
            timeobject = datetime.datetime.strptime(timestring, '%Y-%m-%dT%H:%M:%S.%fZ')
            if timeobject >= termfrom and timeobject <= termto:
                respstring = target + '@' + timeobject.strftime('%Y-%m-%dT%H:%M:%S.%fZ')
                resp.append(respstring)
        return resp

    @debug.entry
    def save_frame(self, target, fileobj, fext='.jpg', uniqname=None, options={'async':False} ):
        '''
            <TODO>
                ストレージにフレームを保存する
            target   : カメラID
            fileobj  : 保存するオブジェクト
            uniqname : reserved
            options  : reserved
        '''
        if uniqname:
            index = target + '@' + uniqname + fext
        else:
            today = datetime.datetime.today()
            index = target + '@' + today.strftime('%Y-%m-%dT%H:%M:%S.%fZ') + fext
        logging.info("save_frame : %s" % index)

        item = {}
        item['Date']   = today.strftime('%Y-%m-%dT%H:%M:%S.%fZ')
        item['CID']    = target
        item['Object'] = fileobj
        item['Fext']   = fext
        if self.cycle <= len(self.storage):
            delitem = self.storage.pop(0)
            logging.info("delete item : %s@%s%s" % (delitem['CID'], delitem['Date'], delitem['Fext']) )
        self.storage.append(item)

    @debug.entry
    def get_frame(self, framestring, fext='.jpg'):
        '''
            <TODO>
                ストレージに格納されたフレームの実体を返す
            target      : カメラID
            framestring : クエリ結果のフレームを示す文字列
            return      : フレームの実体
        '''
        string_div = framestring.split('@')
        target     = string_div[0]
        datestring = string_div[1].replace(fext,'')

        for item in self.storage:
            if target == item['CID'] and datestring == item['Date'] and fext == item['Fext']:
                return item['Object']

        return None
